<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let p = new Promise((resolve, reject) => {
            resolve('ok')
        })
// -----------------------------
        p.then(value => {
            return new Promise((resolve, reject) => {
                resolve('success')
            })
// -----------------------------
        }).then(value => {
            // console.log(value)
            throw '未知错误'
// --------------------------
        }).then(value => {
            console.log(value);//上一个是失败状态,所以这里捕获不到信息的
        }, resaon => {
            console.log(resaon);//捕获到上一个then的promise对象为reject失败状态,值为未知错误
// ----------------------------
        }).then(value => {
            console.log(value);//undefined
            // 上一个then的promise对象没有写返回值定义PromiseState状态,所以默认状态为成功resolve,值为undefined(因为没有写)
        }, resaon => {
            console.log(resaon);//捕获不到信息的,因为上一then的没写返回值,状态默认为成功,被参数一value捕获了
        })
        
         // then的链式调用注意事项:
            // then方法的返回结果是一个全新的promise对象,但是该对象的PromiseState状态是由自身回调函数的返回值决定的
            // 1.如返回值为:未定义/没写,那么then的PromiseState状态为:resolve成功,值为:undefined
            // 2.如返回值为:非promise类型的任意值,那么then的PromiseState状态为:resolve成功,值为:任意值

            // 3.如返回值为:new Promise构造函数, 那么then的PromiseState状态为:取决于new Promise构造函数内的PromiseState状态,值为:取决于new Promise构造函数内的状态结果携带的值

            // 4.如返回值为错误关键字throw,那么then的PromiseState状态为:reject失败,值为:throw抛出的错误信息

          // 备注: 
            // 以上then的PromiseState状态为:resolve成功则调用value成功回调函数
            // 以上then的PromiseState状态为:reject失败则调用resaon失败回调函数
            // 两种不要混淆
    </script>
</body>

</html>